#include "proc/meminfo.h"


// ![0]
static bool meminfo_of_buffer(char *buf, MemoryInfo *memory) {
    if (isNull(buf)) return false;
    // char 
    for (int i = 0; i < sizeof(proc_meminfo_properties)/sizeof(proc_meminfo_properties[0]); i++) {
        if (LineStartWith(buf, (char*)proc_meminfo_properties[i])) {
            GSList *block, *splitT;
            char *part;
            char *value;
            block = split_cnt(buf, ':', 1);
            part = LineTrim((char*)g_slist_nth(block, 1)->data);
            splitT = split(part, ' ');
            value = g_slist_nth(splitT, 0)->data;

            switch (i) {
                case 0: memory->MemTotal = atol(value); break;
                case 1: memory->MemFree = atol(value); break;
                case 2: memory->MemAvailable = atol(value); break;
                case 3: memory->Buffers = atol(value);break;
                case 4: memory->Cached = atol(value); break;
                case 5: memory->SwapTotal = atol(value); break;
                case 6: memory->SwapFree = atol(value); break;
                case 7: memory->Shmem = atol(value); break;
                case 8: memory->Slab = atol(value); break;
                case 9: memory->SReclaimable = atol(value); break;
                case 10: memory->SUnreclaim = atol(value); break;
            }

            GS_FREE_ALL_CLEAN(splitT)
            free(part);
            GS_FREE_ALL_CLEAN(block)
        }
    }
    return true;
}
// ![0]

static bool proc_meminfo_of_buffer(char *buf, MemoryInfo *memory) {
    if (isNull(buf)) return false;

    GSList *splitT = split(buf, '\n');
    // g_slist_foreach(splitT, (GFunc)printf_iterator, "->");
    for (GSList *iter = splitT; iter; iter = iter->next) {
        meminfo_of_buffer(iter->data, memory);
    }
    GS_FREE_ALL_CLEAN(splitT)

    memory->MemUsed = memory->MemTotal - (memory->MemFree + memory->Cached + memory->Buffers + memory->Shmem + memory->SReclaimable);
    memory->SwapUsed = memory->SwapTotal - (memory->SwapFree);

    if (memory->MemTotal>0)
        memory->MemPrecent = (memory->MemUsed / (double)memory->MemTotal)*100 ?:0;
    if (memory->SwapTotal>0)
        memory->SwapPrecent = (memory->SwapUsed / (double)memory->SwapTotal)*100 ?:0;

    return true;
}

bool initMemory(MemoryInfo *memory) {
    if(!FileExists(LINUX_OS_PROC_MEMINFO)) return false;

    char buffer[10000] = {0};
    if (FileReadToBuffer(LINUX_OS_PROC_MEMINFO, buffer, sizeof(buffer)) > 0) {
        return proc_meminfo_of_buffer(buffer, memory);
    }
    return false;
}


// free
// ┌──────────────────────────────────────────────────────────────────────────────┐
// │              total       used       free     shared    buffers     cached    │
// │ Mem:       1523716    1272812     250904      24684     115624     810272    │
// │ -/+ buffers/cache:     346916    1176800                                     │
// │ Swap:            0          0          0                                     │
// └──────────────────────────────────────────────────────────────────────────────┘

// ┌──────────────────────────────────────────────────────────────────────────────┐
// │ bash-4.4# free -h                                                            │
// │ BusyBox v1.27.2 (2021-03-09 19:00:58 CST) multi-call binary.                 │
// │                                                                              │
// │ Used: free [-b/k/m/g]                                                       │
// │                                                                              │
// │ Display the amount of free and used system memory                            │
// └──────────────────────────────────────────────────────────────────────────────┘

// ┌──────────────────────────────────────────────────────────────────────────────┐
// │ bash-4.4# free -b                                                            │
// │              total       used       free     shared    buffers     cached    │
// │ Mem:    1560285184 1302564864  257720320   25280512  118448128  829652992    │
// │ -/+ buffers/cache:  354463744 1205821440                                     │
// │ Swap:            0          0          0                                     │
// │ bash-4.4# free -k                                                            │
// │              total       used       free     shared    buffers     cached    │
// │ Mem:       1523716    1272152     251564      24692     115688     810212    │
// │ -/+ buffers/cache:     346252    1177464                                     │
// │ Swap:            0          0          0                                     │
// │ bash-4.4# free -m                                                            │
// │              total       used       free     shared    buffers     cached    │
// │ Mem:          1488       1242        245         24        112        791    │
// │ -/+ buffers/cache:        338       1149                                     │
// │ Swap:            0          0          0                                     │
// │ bash-4.4# free -g                                                            │
// │              total       used       free     shared    buffers     cached    │
// │ Mem:             1          1          0          0          0          0    │
// │ -/+ buffers/cache:          0          1                                     │
// │ Swap:            0          0          0                                     │
// └──────────────────────────────────────────────────────────────────────────────┘

// cat /proc/meminfo
// ┌──────────────────────────────────────────────────────────────────────────────┐
// │ MemTotal:        1523716 kB                                                  │
// │ MemFree:          251744 kB                                                  │
// │ MemAvailable:    1221200 kB                                                  │
// │ Buffers:          115640 kB                                                  │
// │ Cached:           810204 kB                                                  │
// │ SwapCached:            0 kB                                                  │
// │ Active:           527848 kB                                                  │
// │ Inactive:         571364 kB                                                  │
// │ Active(anon):     184036 kB                                                  │
// │ Inactive(anon):    14004 kB                                                  │
// │ Active(file):     343812 kB                                                  │
// │ Inactive(file):   557360 kB                                                  │
// │ Unevictable:           0 kB                                                  │
// │ Mlocked:               0 kB                                                  │
// │ SwapTotal:             0 kB                                                  │
// │ SwapFree:              0 kB                                                  │
// │ Dirty:                 0 kB                                                  │
// │ Writeback:             0 kB                                                  │
// │ AnonPages:        173368 kB                                                  │
// │ Mapped:            43992 kB                                                  │
// │ Shmem:             24684 kB                                                  │
// │ Slab:             117896 kB                                                  │
// │ SReclaimable:      89132 kB                                                  │
// │ SUnreclaim:        28764 kB                                                  │
// │ KernelStack:        4528 kB                                                  │
// │ PageTables:         2632 kB                                                  │
// │ NFS_Unstable:          0 kB                                                  │
// │ Bounce:                0 kB                                                  │
// │ WritebackTmp:          0 kB                                                  │
// │ CommitLimit:      761856 kB                                                  │
// │ Committed_AS:    1341340 kB                                                  │
// │ VmallocTotal:   263061440 kB                                                 │
// │ VmallocUsed:           0 kB                                                  │
// │ VmallocChunk:          0 kB                                                  │
// │ CmaTotal:           4096 kB                                                  │
// │ CmaFree:            3060 kB                                                  │
// │ HugePages_Total:       0                                                     │
// │ HugePages_Free:        0                                                     │
// │ HugePages_Rsvd:        0                                                     │
// │ HugePages_Surp:        0                                                     │
// │ Hugepagesize:       2048 kB                                                  │
// └──────────────────────────────────────────────────────────────────────────────┘